home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / PROCAL13.DMS / PROCAL13.adf / Rexx / months.rexx next >
OS/2 REXX Batch file  |  1991-12-11  |  6KB  |  155 lines

  1. /* Months                     S. Dicker                 6-Aug-89    */
  2. /*                                                                  */
  3. /*    ARexx program used to enter the 3 character month names into  */
  4. /*  a selected range of cells. If the selected range contains fewer */
  5. /*  than 12 cells, only the required number of months to fill the   */
  6. /*  range will be written. If more than 12 cells are selected, the  */
  7. /*  fill operation quits after "Dec" has been written. When the     */
  8. /*  range encompasses more than one row and more than one column,   */
  9. /*  the cells in the first row will be filled before the second row */
  10. /*  is started.                                                     */
  11.  
  12. signal on error                 /* Trap host command errors. */
  13.  
  14. address 'Advantage'             /* Send commands to Advantage. */
  15.  
  16. options results                 /* Enable return of string results. */
  17.  
  18. months = 'JanFebMarAprMayJunJulAugSepOctNovDec'
  19.  
  20. 'Current'                       /* Determine current selected range. */
  21. range = result
  22.  
  23. colon_posn = pos(":",range)     /* Look for colon delimiter in range. */
  24.  
  25. if colon_posn = 0 then          /* If no colon, this is not a range. */
  26.    do                           /*  Set the start and end cells to   */
  27.       start_cell = range        /*   the selected cell.              */
  28.       end_cell = range
  29.    end
  30. else                            /* Otherwise, it is a range. */
  31.    /* Extract the start/end cells from the specified range. */
  32.    do
  33.       start_cell = left(range,colon_posn - 1)
  34.       end_cell   = substr(range,colon_posn + 1)
  35.    end
  36.    
  37. start_column = GetColumn(start_cell)    /* Determine range of columns */
  38. end_column   = GetColumn(end_cell)      /*  to be filled.             */
  39.  
  40. start_row = GetRow(start_cell)          /* Determine range of rows */
  41. end_row   = GetRow(end_cell)            /*  to be filled.          */
  42.  
  43. month_number = 0                        /* Start at "January". */
  44.  
  45. /* Fill cells with month names, row by row. */
  46. do rownum = start_row to end_row
  47.    
  48.    if month_number > 11 then break      /* Quit after "December". */
  49.    
  50.    column = start_column                /* Reset column pointer.  */
  51.    
  52.    /* Fill columns until we run out of months or reach the end */
  53.    /* of the row.                                              */
  54.    do until month_number > 11 | c2d(column) > c2d(end_column)
  55.       /* Build complete cell name from row and column. */
  56.       next_cell = column || rownum
  57.       /* Select the cell to be modified. */
  58.       'SelectCell'                   
  59.          value(next_cell)
  60.       /* Get next month name. */
  61.       month_name = substr(months,month_number*3+1,3)
  62.       /* Load month name into cell. */
  63.       'PutCell'
  64.          month_name
  65.       /* Advance to the next column and the next month. */
  66.       column = NextColumn(column)
  67.       month_number = month_number + 1
  68.    end
  69.    
  70. end rownum
  71.       
  72. /* Reselect the original range of cells. */
  73. 'SelectRange'
  74.    value(start_cell)
  75.    value(end_cell)
  76.  
  77. exit                    /* That's all folks! */
  78.  
  79. /* >>> Host command error handler <<< */
  80. Error:
  81.    exit rc                 /* Just bail out and return error code. */
  82.  
  83.  
  84. /* ----------------------------------------------------------------- */
  85. /*            Internal Functions (subroutines)                       */
  86. /* ----------------------------------------------------------------- */
  87.  
  88. /* == GetRow: Extract the row number from a cell name. == */
  89.  
  90. GetRow: procedure
  91.    arg CellName      /* Function expects to be passed a cell name. */
  92.  
  93.    /* Find the first numeric digit in the cell name. */
  94.    start_number = verify(CellName,"0123456789","Match")
  95.    
  96.    /* Extract all characters starting at the first digit and continuing */
  97.    /* to the end of the cell name.                                      */
  98.    rownum = substr(CellName,start_number)
  99.  
  100. return rownum
  101.  
  102. /* == GetColumn: Extract the column label from a cell name. == */
  103.  
  104. GetColumn: procedure
  105.    arg CellName      /* Function expects to be passed a cell name. */
  106.  
  107.    /* Find the first numeric digit in the cell name. */
  108.    start_number = verify(CellName,"0123456789","Match")
  109.    
  110.    /* Extract all characters in the cell name up to the first numeric */
  111.    /* character (start of row number).                                */
  112.    column = left(CellName,start_number-1)
  113.  
  114. return column
  115.  
  116. /* == NextColumn: Given the current column label, determine the label == */
  117. /* ==              for the next sequential column. NOTE: This is a    == */
  118. /* ==              recursive function.                                == */
  119.  
  120. NextColumn: procedure
  121.    arg ThisColumn    /* Function expects to be passed a column label. */
  122.  
  123.    /* If the column label is empty (null string), then we must be */
  124.    /* starting a new group of column labels (for example, going   */
  125.    /* from column ZZ to column AAA. Return an "A".                */
  126.    if length(ThisColumn) = 0 then
  127.       new_column = "A"
  128.    
  129.    /* Otherwise, we must advance the last character in the column */
  130.    /* name to the next sequential alphabetic character.           */
  131.    else
  132.       do
  133.          col_number = ,                 /* Convert last character */
  134.             c2d( right(ThisColumn,1) )  /*  to decimal value.     */
  135.    
  136.          col_number = col_number + 1    /* Increment to next character. */
  137.          new_char = d2c(col_number)     /* Convert back to a character. */
  138.    
  139.          /* If we've gone past 'Z', find the next column for the column */
  140.          /* label minus the last character and then append an "A" to    */
  141.          /* this label (start of a new label set).                      */
  142.          if new_char > "Z" then
  143.             do
  144.                temp_column = left( ThisColumn, length(ThisColumn)-1 )
  145.                new_column = NextColumn(temp_column) || "A"
  146.             end
  147.          
  148.          /* Otherwise, replace the last character of the column label */
  149.          /* with the next sequential character.                       */
  150.          else
  151.             new_column = overlay(new_char,ThisColumn,length(ThisColumn))
  152.       end
  153.  
  154. return new_column
  155.